Название плагина: DKR_UsefulPictures
Автор: DarchanKaen
Версия: 2.0
Дата выхода:
Версия 2.0 - 22.01.2022
Описание плагина:
Плагин позволяет использовать картинки дополнительнымы способами, а именно - вызывает Общие события при:
1. Ховере (наведении) над картинкой.
2. ЛКМ на картинке.
3. При перемещении картинки после ЛКМ (реализован примитивный "Драг-н-дроп") на специальную картинку-"дропзону".
4. ПКМ (не привязано к картинке).
5. Клик колеса мыши ("МКМ"; не привязано к картинке").
Может быть полезен для мини-игр, пазлов, боёвок, поинт-н-клик игр.
Для полноценного использования нужно самое базовое знание JavaScript (создание и исп-е массивов и объектов)!
Плагин работает ТОЛЬКО с компьютерной мышью! С геймпадом и тачскрином смартфона плагин не работает.
Видео работы плагина (из демки):
Спойлер Тык:
Нюансы:
0. Плагин не совместим с другими плагинами на мышь, даже моими.
1. Удаление картинки не равно удалению ее настроек или дропзоны - они удаляются вызовом скрипта!
2. Картинка может быть ИЛИ "Полезной картинкой" ИЛИ "Дропзоной" - не одновременно!
3. Для корректно работы плагина после загрузки файла сохранения - используйте плагин Galv`а на вызов Общего события после загрузки.
4. В ПКМ стразу встроено отмена выбранной картинки для перемещения.
5. Плагин работает ТОЛЬКО вне боя.
6. Плагин предоставляет базовую функциональность драг-н-дропа картинок и одним только его включением "Покер" сделать не получится.
Использование плагина:
Параметры плагина
Переменные для хранения списков Картинок, Дропзон, Пересечений; переключатели для хранения статуса работы мыши и доступности перемещений картинок;
номера общих события для ПКМ и МКМ (нажатие на колёсико мыши); номера переменных для хранения статистики
Команды (в эвенте, в команде "Скрипт")
DKR.UsefulPictures.disableLRMC();- отключает стандартное поведения мыши, НУЖНО ЗАПУСКАТЬ ДЛЯ РАБОТЫ ПЛАГИНА!.
DKR.UsefulPictures.enableLRMC();- включает стандартное поведение мыши.
DKR.UsefulPictures.setCommonEventToRMC(ceId); - задает Общее событие для ПКМ.
DKR.UsefulPictures.setCommonEventToMMC(ceId); - задает Общее события для МКМ.
DKR.UsefulPictures.testUsefulPics(); - выводит на консоль перечень настроенных картинок.
DKR.UsefulPictures.createUsefulPic(picSettings); - создает настроенную картинку с заданными настройками.
DKR.UsefulPictures.getUsefulPic(usefulPicId); - возвращает настройки картинки с указанным номером.
DKR.UsefulPictures.updateUsefulPic(usefulPicId, listOfSettingsToUpdate); - обновляет указанные настройки картинки с указанным номером.
DKR.UsefulPictures.deleteUsefulPic(usefulPicId); - удаляет настройку картинку с указанным номером.
DKR.UsefulPictures.testDropzone(); - выводит на консоль перечень дропзон.
DKR.UsefulPictures.createDropZone(dropzoneSettings ); - создает настроенную картинку с заданными настройками.
DKR.UsefulPictures.getDropZone(dropzoneId); - возвращает дропзону с указанным номером.
DKR.UsefulPictures.updateDropZone(dropzoneId, listOfSettingsToUpdate); - обновляет указанные настройки дропзоны с указанным номером.
DKR.UsefulPictures.deleteDropZone(dropzoneId); - удаляет дропзону с указанным номером.
DKR.UsefulPictures.testVault(); - выводит на консоль список пересечений картинок и дропзон.
DKR.UsefulPictures.isUsefulPicOnDropzones(usefulPi cId, logicOrIndex); - для получения информации, находится ли указанная картинка хоть на какой-нибудь дропзоне; возвращает true/false или номер дропзоны (-1, при негативном результате).
DKR.UsefulPictures.isUsefulPicOnConcreteDropzone(u sefulPicId, dropzoneId); - для получения информации, находится ли указанная картинка на конкретной дропзоне; возвращает true/false.
DKR.UsefulPictures.getUsefulPicsFromDropzone(dropz oneId); - возвращает массив с перечнем настроек картинок, что находятся на указанной дропзоне; может вернуть пустой массив.
где
ceId - номер Общего события; если 0 или -1, то событие не вызывется.
picSettings - структура настроек картинки.
usefulPicId - номер картинки.
listOfSettingsToUpdate - массив настроек для обновления картинки / дропзоны (['имя настройки', новое значение]).
dropzoneSettings - структура настроект дрозпоны.
dropzoneId - номер картинки-дропзоны.
logicOrIndex - тип запрашиваемого значения; может быть 'logic' или 'index'.
Спойлер Примеры настроек Картинок и Дропзон (важно!):
Для понимания - обязательно откройте демо редактором и просмотрите!
Настройки картинок
Настройки дропзонКод:let picSettings = { id: 1, mark: '', isHoverable: true, onHoverCommonEventId: 32, isClickableLeft: true, onLeftClickCommonEventId: 33, isMovable: true, moveSpeed: 60, onDropzoneCommonEventId: 37 }
Код:let dropzoneSettings = { id: 1, mark: '', dropState: 'active' dropType: 'free' dropAfter: 'work' onDropCommonEventId: 35 }
Код:
Спойлер Версия 2.0:
Код:var Imported = Imported || {}; Imported.DKR_UsefulPictures = true; var DKR = DKR || {}; DKR.UsefulPictures = DKR.UsefulPictures || {}; DKR.UsefulPictures.version = 2.0; //----------------------------------------------------------------------------- /*: * @plugindesc (v.2.0.0) Плагин позволяет использовать картинки дополнительнымы способами, а именно: вызывать Общее событие по ховеру, ЛКМ, примитивному "дран-н-дропу". * * @target MZ * @author DarchanKaen * * @help * DKR UsefulPictures * ---------------------------------------------------------------------------- * ---Общая информация: * Плагин позволяет использовать картинки дополнительнымы способами, * а именно - вызывает Общие события при: * 1. Ховере над картинкой. * 2. ЛКМ на картинке. * 3. При перемещении картинки после ЛКМ (реализован примитивный "Драг-н-дроп") на специальную картинку-"дропзону". * 4. ПКМ (не привязано к картинке). * 5. Клик колеса мыши ("МКМ"; не привязано к картинке"). * Плагин НЕ СОВМЕСТИМ с другими плагинами на мышь! * Подробнее - смотри на rpgmaker.su в теме плагинов. * ---Команды(в эвенте команда "Скрипт"): * DKR.UsefulPictures.disableLRMC(); - отключает стандартное поведения мыши, НУЖНО ЗАПУСКАТЬ ДЛЯ РАБОТЫ ПЛАГИНА!. * DKR.UsefulPictures.enableLRMC(); - включает стандартное поведение мыши. * DKR.UsefulPictures.setCommonEventToRMC(ceId); - задает Общее событие для ПКМ. * DKR.UsefulPictures.setCommonEventToMMC(ceId); - задает Общее события для МКМ. * DKR.UsefulPictures.testUsefulPics(); - выводит на консоль перечень настроенных картинок. * DKR.UsefulPictures.createUsefulPic(picSettings); - создает настроенную картинку с заданными настройками. * DKR.UsefulPictures.getUsefulPic(usefulPicId); - возвращает настройки картинки с указанным номером. * DKR.UsefulPictures.updateUsefulPic(usefulPicId, listOfSettingsToUpdate); - обновляет указанные настройки картинки с указанным номером. * DKR.UsefulPictures.deleteUsefulPic(usefulPicId); - удаляет настройку картинку с указанным номером. * DKR.UsefulPictures.testDropzone(); - выводит на консоль перечень дропзон. * DKR.UsefulPictures.createDropZone(dropzoneSettings ); - создает настроенную картинку с заданными настройками. * DKR.UsefulPictures.getDropZone(dropzoneId); - возвращает дропзону с указанным номером. * DKR.UsefulPictures.updateDropZone(dropzoneId, listOfSettingsToUpdate); - обновляет указанные настройки дропзоны с указанным номером. * DKR.UsefulPictures.deleteDropZone(dropzoneId); - удаляет дропзону с указанным номером. * DKR.UsefulPictures.testVault(); - выводит на консоль список пересечений картинок и дропзон. * DKR.UsefulPictures.isUsefulPicOnDropzones(usefulPi cId, logicOrIndex); - для получения информации, находится ли указанная картинка хоть на какой-нибудь дропзоне; возвращает true/false или номер дропзоны (-1, при негативном результате). * DKR.UsefulPictures.isUsefulPicOnConcreteDropzone(u sefulPicId, dropzoneId); - для получения информации, находится ли указанная картинка на конкретной дропзоне; возвращает true/false. * DKR.UsefulPictures.getUsefulPicsFromDropzone(dropz oneId) - возвращает массив с перечнем настроек картинок, что находятся на указанной дропзоне; может вернуть пустой массив. где * ceId - номер Общего события; если 0 или -1, то событие не вызывется. * picSettings - структура настроек картинки. * usefulPicId - номер картинки. * listOfSettingsToUpdate - массив настроек для обновления картинки / дропзоны (['имя настройки', новое значение]). * dropzoneSettings - структура настроект дрозпоны. * dropzoneId - номер картинки-дропзоны. * logicOrIndex - тип запрашиваемого значения; может быть 'logic' или 'index'. * * ДЛЯ ПОНИМАНИЯ СТРУКТУРЫ НАСТРОЕК КАРТИНКИ И ДРОПЗОНЫ - ОТКРОЙКТЕ ПЛАГИН БЛОКНОТОМ И НАЙДИТЕ "SETTINGS STRUCTURES". * ПОДРОБНЕЕ - СМОТРИ ДЕМКУ на rpgmaker.su В ТЕМЕ ПЛАГИНА! * ---------------------------------------------------------------------------- * * @param defaultLRMCWorkSwitchId * @type number * @desc Номер переключателя, хранящего статус стандартной / нестандартной работы мыши. Не для ручного переключения. (НЕОБХОДИМ!) * @default 12 * * @param usefulPicturesListVarId * @type variable * @desc Номер переменной для сохранения Списка картинок (НЕБХОДИМ!) * @default 71 * * @param dropzonesListVarId * @type variable * @desc Номер переменной для сохранения Списка дропзон (НЕБХОДИМ!) * @default 72 * * @param vaultListVarId * @type variable * @desc Номер переменной для сохранения Списка пересечений картинок и дропзон * @default 73 * * @param movableSwitchId * @type number * @desc Номер переключателя, позволяющего движение картинок * @default 13 * * @param rightMouseClickEventId * @type number * @desc Номер Общего события на ПКМ * @default 34 * * @param middleMouseClickEventId * @type number * @desc Номер Общего события на МКМ (колёсико) * @default 36 * * @param lastHoveredPicVarId * @type variable * @desc Номер переменной для хранения номера картинки, по которой последний раз был Ховер * @default 65 * * @param lastClickedPicVarId * @type variable * @desc Номер переменной для хранения номера картинки, по которой последний раз был клик ЛКМ * @default 66 * * @param lastMovedPicVarId * @type variable * @desc Номер переменной для хранения номера картинки, по которая последний раз перемещалась * @default 67 * * @param lastDroppedPicVarId * @type variable * @desc Номер переменной для хранения номера картинки, которая последний раз помещалась в дропзону * @default 68 * * @param lastUsedDropzoneVarId * @type variable * @desc Номер переменной для хранения номера дропзоны, на которую в послдний раз перемещалась картинка * @default 69 * * */ //UNCOMPABILE WTH PRIMITIVE BUTTON! BUT WORK WITH DEFAULT TEXT BUTTON! ( () => { //----DATA: BEGIN //---params DKR.UsefulPictures.parameters = PluginManager.parameters('DKR_UsefulPictures'); let defaultLRMCWorkSwitchId = Number(DKR.UsefulPictures.parameters["defaultLRMCWorkSwitchId"]); let usefulPicturesListVarId = Number(DKR.UsefulPictures.parameters["usefulPicturesListVarId"]); let dropzonesListVarId = Number(DKR.UsefulPictures.parameters["dropzonesListVarId"]); let vaultListVarId = Number(DKR.UsefulPictures.parameters["vaultListVarId"]); let rightMouseClickEventId = Number(DKR.UsefulPictures.parameters["rightMouseClickEventId"]); let middleMouseClickEventId = Number(DKR.UsefulPictures.parameters["middleMouseClickEventId"]); let movableSwitchId = Number(DKR.UsefulPictures.parameters["movableSwitchId"]); let lastHoveredPicVarId = Number(DKR.UsefulPictures.parameters["lastHoveredPicVarId"]); let lastClickedPicVarId = Number(DKR.UsefulPictures.parameters["lastClickedPicVarId "]); let lastMovedPicVarId = Number(DKR.UsefulPictures.parameters["lastMovedPicVarId"]); let lastDroppedPicVarId = Number(DKR.UsefulPictures.parameters["lastDroppedPicVarId"]); let lastUsedDropzoneVarId = Number(DKR.UsefulPictures.parameters["lastUsedDropzoneVarId"]); //--inner data let pictureToMoveId = -1; let pictureToMoveSpeed = -1; let touchedDropzoneId = -1; const picToMoveOrigin = 0; const picToMoveScaleX = 100; const picToMoveScaleY = 100; const picToMoveOpacity = 255; const picToMoveBlendMode = 0; const DROPZONE_TYPE_LOCK_CODEWORD = 'lock'; const DROPZONE_STATE_SLEEP_CODEWORD = 'sleep'; const DROPZONE_AFTER_OFF_CODEWORD = 'off'; const GET_PIC_ON_DROPZONE_LOGIC_CODEWORD = 'logic'; const GET_PIC_ON_DROPZONE_INDEX_CODEWORD = 'index'; /* //---- SETTINGS STRUCTURES //--USEFUL PICS //-CREATE USEFUL PIC: let picSettings = { id: 1, mark: '', isHoverable: true, onHoverCommonEventId: 32, isClickableLeft: true, onLeftClickCommonEventId: 33, isMovable: true, moveSpeed: 60, onDropzoneCommonEventId: 37 } createUsefulPicture(picSettings); //-UPDATE USEFUL PIC: updateUsefulPicture(1, [[mark: 'aasd'], [isHoverable: false]]) //-DELETE USEFUL PIC deleteUsefulPicture(1); //--DROPZONES //-CREATE DROPZONE let dropzoneSettings = { id: 1, mark: '', dropState: 'active', 'sleep' dropType: 'free', 'lock' //LOCK dropAfter: 'work', 'off' onDropCommonEventId: 35 } createDropzone(dropzoneSettings); //-UPDATE DROPZONE: updateDropzone(1, [[mark: 'aasd'], [dropMode: part]]) //-DELETE DROPZONE deleteDropzone(1); //--DEMO INGAME TEST 45 = red dropzone 34 = yellow drpzone 21 = black pic 11 = blue picture 1 = green pic */ //----DATA: END //----PLUGIN LOGIC: BEGIN //---USEFUL PICTURES (HOVER AND CLICK) //--create const createUsefulPicture = (usefulPicSettings) => { let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || []; if(-1 === usefulPicsList.indexOf(usefulPicSettings)){ usefulPicsList.push(usefulPicSettings); $gameVariables.setValue(usefulPicturesListVarId, usefulPicsList); } } //--update const updateUsefulPicture = (usefulPicId, listOfSettingsToUpdate) => { let usefulPic = getUsefulPicture(usefulPicId); if(null === usefulPic || undefined === usefulPic){ console.log('DKR.UsefulPictures_ERROR: USEFUL PIC ARE NOT EXIST! Id:', usefulPicId); return; }else{ for(let n = 0; n < listOfSettingsToUpdate.length; n++){ let currSettingName = listOfSettingsToUpdate[n][0]; let currSettingValue = listOfSettingsToUpdate[n][1]; if( false === usefulPic.hasOwnProperty ){ console.log('DKR.UsefulPictures_ERROR: SETTINGS ARE NOT EXIST!'); }else{ usefulPic[currSettingName] = currSettingValue; } } let index = getUsefulPictureIndexIn(usefulPicId); let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || []; usefulPicsList[index] = usefulPic; $gameVariables.setValue(usefulPicturesListVarId, usefulPicsList); } } //--get const getUsefulPicture = (usefulPicId) => { let usefulPic = null; let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || []; usefulPic = usefulPicsList.filter(pic => pic.id === usefulPicId)[0]; return usefulPic; } //--delete const deleteUsefulPicture = (usefulPicId) => { let index = getUsefulPictureIndexIn(usefulPicId); let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || []; delete usefulPicsList[index]; usefulPicsList = usefulPicsList.filter(pic => pic === pic); $gameVariables.setValue(usefulPicturesListVarId, usefulPicsList); deleteUsefulPicOrDropzoneFromVault(usefulPicId, true); } //--get index in const getUsefulPictureIndexIn = (usefulPicId) => { let innerIndex = -1; let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || []; for(let n = 0; n < usefulPicsList.length; n++){ if(usefulPicId === usefulPicsList[n].id){ innerIndex = n; } } return innerIndex; } //--- //---DROPZONES (USEFUL PICTURES DETECTORS) //-create const createDropzone = (dropzoneSettings) => { let dropzonesList = $gameVariables.value(dropzonesListVarId) || []; if(-1 === dropzonesList.indexOf(dropzoneSettings)){ dropzonesList.push(dropzoneSettings); $gameVariables.setValue(dropzonesListVarId, dropzonesList); } } //--update const updateDropzone = (dropzoneId, listOfSettingsToUpdate) => { let dropzone = getDropzone(dropzoneId); if(null === dropzone || undefined === dropzone){ console.log('DKR.UsefulPictures_ERROR: DROPZONE ARE NOT EXIST!'); return; }else{ for(let n = 0; n < listOfSettingsToUpdate.length; n++){ let currSettingName = listOfSettingsToUpdate[n][0]; let currSettingValue = listOfSettingsToUpdate[n][1]; if( false === dropzone.hasOwnProperty ){ console.log('DKR.UsefulPictures_ERROR: SETTINGS ARE NOT EXIST!'); }else{ dropzone[currSettingName] = currSettingValue; } } let dropzonesList = $gameVariables.value(dropzonesListVarId) || []; let index = getDropzoneIndexIn(dropzoneId); dropzonesList[index] = dropzone; $gameVariables.setValue(dropzonesListVarId, dropzonesList); } } //--get const getDropzone = (dropzoneId) => { let dropzone = null; let dropzonesList = $gameVariables.value(dropzonesListVarId) || []; dropzone = dropzonesList.filter(dropzone => dropzone.id === dropzoneId)[0]; return dropzone; } //--delete const deleteDropzone = (dropzoneId) => { let index = getDropzoneIndexIn(dropzoneId); let dropzonesList = $gameVariables.value(dropzonesListVarId) || []; delete dropzonesList[index]; dropzonesList = dropzonesList.filter(dropzone => dropzone === dropzone); $gameVariables.setValue(dropzonesListVarId, dropzonesList); deleteUsefulPicOrDropzoneFromVault(dropzoneId, false); } //--is contain usefulPic in dropzone const isUsefulPicInDropzones = (gamePictureCoordsList) => { let matchedDropzone = null; let xCoord = gamePictureCoordsList[0]; let yCoord = gamePictureCoordsList[1]; let gamePicturesList = $gameScreen._pictures; for(let n = 1; n < gamePicturesList.length; n++){ //pictures start with 1!!! if(-1 !== getDropzone(n) ){ let currentDropzone = getDropzone(n); if(null !== currentDropzone && undefined !== currentDropzone){ let dropzonePicWidthAndHeight = getPictureWidthAndHeight(n); let dropzoneBeginX = gamePicturesList[n]._x; let dropzoneBeginY = gamePicturesList[n]._y; let dropzoneEndX = dropzoneBeginX + dropzonePicWidthAndHeight[0]; let dropzoneEndY = dropzoneBeginY + dropzonePicWidthAndHeight[1]; let isInDropzone = isDestinationCoordInDropzone(xCoord, yCoord, dropzoneBeginX, dropzoneBeginY, dropzoneEndX, dropzoneEndY); if(true === isInDropzone){ matchedDropzone = currentDropzone; } } } } return matchedDropzone; } const isDestinationCoordInDropzone = (clickX, clickY, dropzoneBeginX, dropzoneBeginY, dropzoneEndX, dropzoneEndY) => { let isInDropZone = false; if( ( clickX >= dropzoneBeginX && clickX <= dropzoneEndX ) && ( clickY >= dropzoneBeginY && clickY <= dropzoneEndY ) ){ isInDropZone = true; } return isInDropZone; } //--get index in const getDropzoneIndexIn = (dropzoneId) => { let innerIndex = -1; let dropzonesList = $gameVariables.value(dropzonesListVarId) || []; for(let n = 0; n < dropzonesList.length; n++){ if(dropzoneId === dropzonesList[n].id){ innerIndex = n; } } return innerIndex; } //--- //---VAULT OF USEFUL PICS ON DROPZONES (STORAGE FOR USEFUL PICTURES ON DROPZONES) //if one in Vault - FOREVER in vault! //--add const addUsefulPicOnDropzoneToVault = (usefulPicId, dropzoneId) => { let vaultObj = null; let vaultObjIndex = isAlreadyInVault(usefulPicId, dropzoneId); let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || []; if(-1 === vaultObjIndex){ vaultObj = {usefulPicId, dropzoneId, isOn: true}; usefulPicsOnDropzonesVault.push(vaultObj); $gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault); }else{ vaultObj = getVaultObj(usefulPicId, dropzoneId); vaultObj.isOn = true; usefulPicsOnDropzonesVault[vaultObjIndex] = vaultObj; $gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault); } } //--remove (off) const removeUsefulPicOnDropzoneFromVault = (usefulPicId) => { let dropzonesList = $gameVariables.value(dropzonesListVarId) || []; let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || []; let vaultObj = null; for(let n = 0; n < dropzonesList.length; n++){ let dropzoneId = dropzonesList[n].id; let vaultObjIndex = isAlreadyInVault(usefulPicId, dropzoneId); if(-1 === vaultObjIndex){ continue; }else{ vaultObj = getVaultObj(usefulPicId, dropzoneId); vaultObj.isOn = false; usefulPicsOnDropzonesVault[vaultObjIndex] = vaultObj; $gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault); } } } //--delete (full delete from vault) const deleteUsefulPicOrDropzoneFromVault = (someId, isDeleteUsefulPic) => { let toDelIndexesList = []; let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || []; let vaultObj = null; for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){ vaultObj = usefulPicsOnDropzonesVault[n]; if(true === isDeleteUsefulPic){ if(someId === vaultObj.usefulPicId){ toDelIndexesList.push(n); } }else{ if(someId === vaultObj.dropzoneId){ toDelIndexesList.push(n); } } } for(let m = 0; m < toDelIndexesList.length; m++){ let currToDelIndex = toDelIndexesList[m]; delete usefulPicsOnDropzonesVault[currToDelIndex]; } usefulPicsOnDropzonesVault = usefulPicsOnDropzonesVault.filter(someVaultObj => someVaultObj === someVaultObj); $gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault); } //--get const getVaultObj = (usefulPicId, dropzoneId) => { let vaultObj = null; let vaultObjIndex = isAlreadyInVault(usefulPicId, dropzoneId); let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || []; if( -1 !== vaultObjIndex ){ vaultObj = usefulPicsOnDropzonesVault[vaultObjIndex]; } return vaultObj; } //--search const isAlreadyInVault = (usefulPicId, dropzoneId) => { let isInVault = -1; let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || []; for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){ let currentVaultObj = usefulPicsOnDropzonesVault[n]; if(usefulPicId === currentVaultObj.usefulPicId && dropzoneId === currentVaultObj.dropzoneId){ // && true === currentVaultObj.isOn isInVault = n; } } return isInVault; } //--for outer code (... .isUsefulPicOnDropzones) const isUsefulPictureOnDropzones = (usefulPicId, resultType) => { let result = false; let dropzoneIndex = -1; let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || []; for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){ let currentVaultObj = usefulPicsOnDropzonesVault[n]; if(usefulPicId === currentVaultObj.usefulPicId && true === currentVaultObj.isOn){ dropzoneIndex = currentVaultObj.dropzoneId break; } } if(GET_PIC_ON_DROPZONE_LOGIC_CODEWORD === resultType){ if(-1 === dropzoneIndex){ result = false; }else{ result = true; } }else if(GET_PIC_ON_DROPZONE_INDEX_CODEWORD === resultType){ result = dropzoneIndex; }else{ console.log('DKR.UsefulPictures_ERROR: RESULT VARIANT ARE NOT EXIST!:', resultType); } return result; } //--for outer code (... .isUsefulPicOnConcreteDropzone) const isUsefulPictureOnConcreteDropzone = (usefulPicId, dropzoneId) => { let result = false; let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || []; for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){ let currentVaultObj = usefulPicsOnDropzonesVault[n]; if(usefulPicId === currentVaultObj.usefulPicId && dropzoneId === currentVaultObj.dropzoneId && true === currentVaultObj.isOn){ // result = true; break; } } return result; } //--for outer code (... .getUsefulPicsOnDropzone) const getUsefulPicturesFromDropzone = (dropzoneId) => { let usefulPicsOnDropzoneList = []; let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || []; let vaultObjectsOnDropzone = []; for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){ let currentVaultObj = usefulPicsOnDropzonesVault[n]; if(dropzoneId === currentVaultObj.dropzoneId && true === currentVaultObj.isOn){ vaultObjectsOnDropzone.push(currentVaultObj); } } for(let m = 0; m < vaultObjectsOnDropzone.length; m++){ let currentVaultObj = vaultObjectsOnDropzone[m]; let currentUsefulPicture = getUsefulPicture(currentVaultObj.usefulPicId); usefulPicsOnDropzoneList.push(currentUsefulPicture ); } $gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault); return usefulPicsOnDropzoneList; } //--- //---UTILS const setPictureIdToVariable = (picId, varId) =>{ if(varId > 0){ $gameVariables.setValue(varId, picId); } } //----PLUGIN LOGIC: END //----MAKER !!! MOUSE !!! LOGIC: BEGIN //---DISABLE MOUSE STANDARD BEHAVIOUR const disableMouseStandardBehaviour = () =>{ Game_Temp.prototype.setDestination = function(x, y) {}; Scene_Map.prototype.isMenuCalled = function() { return Input.isTriggered('menu'); }; //isDefaultLRMCWork = false; let isDefaultLRMCWork = false; $gameSwitches.setValue(defaultLRMCWorkSwitchId, isDefaultLRMCWork); } //---ENABLE MOUSE STANDARD BEHAVIOUR const enableMouseStandardBehaviour = () =>{ Game_Temp.prototype.setDestination = function(x, y) { this._destinationX = x; this._destinationY = y; }; Scene_Map.prototype.isMenuCalled = function() { return Input.isTriggered("menu") || TouchInput.isCancelled(); }; //isDefaultLRMCWork = true; let isDefaultLRMCWork = true; $gameSwitches.setValue(defaultLRMCWorkSwitchId, isDefaultLRMCWork); //--for cancel picture movement pictureToMoveId = -1; pictureToMoveSpeed = -1; touchedDropzoneId = -1; } //---ON HOVER Sprite_Clickable.prototype.onMouseEnter = function() { try{ let pic = this.picture(); let picId = $gameScreen._pictures.indexOf(pic); let usefulPictureSettings = getUsefulPicture(picId); if(null == usefulPictureSettings){ console.log('DKR.UsefulPictures_ERROR: HOVER__USEFUL PICTURE NOT EXIST OR NOT SET!'); }else{ if(true === usefulPictureSettings.isHoverable && usefulPictureSettings.onHoverCommonEventId > 0){ setPictureIdToVariable(picId, lastHoveredPicVarId); $gameTemp.reserveCommonEvent(usefulPictureSettings .onHoverCommonEventId); } } }catch(exception){ //console.log('DKR.UsefulPictures_ERROR: onMouse-Enter: ERROR'); //console.log(exception); } } //---ON PICTURE CLICK FOR LMC...TO CHOOSE OR CE Sprite_Clickable.prototype.onClick = function() { let isDefaultLRMCWork = $gameSwitches.value(defaultLRMCWorkSwitchId); if(true === isDefaultLRMCWork){ console.log('DKR.UsefulPictures_INFO: isDefaultLRMCWork IS ON, CANT WORK!'); return; } try{ let pic = this.picture(); let picId = $gameScreen._pictures.indexOf(pic); let usefulPictureSettings = getUsefulPicture(picId); if(null == usefulPictureSettings || undefined == usefulPictureSettings){ console.log('DKR.UsefulPictures_ERROR: LMC__USEFUL PICTURE NOT EXIST OR NOT SET! Id:', picId); }else{ if(true === usefulPictureSettings.isClickableLeft && usefulPictureSettings.onLeftClickCommonEventId > 0){ setPictureIdToVariable(picId, lastClickedPicVarId); $gameTemp.reserveCommonEvent(usefulPictureSettings .onLeftClickCommonEventId); } if(true === usefulPictureSettings.isMovable){ pictureToMoveId = picId; pictureToMoveSpeed = usefulPictureSettings.moveSpeed; } } }catch(exception){ console.log('DKR.UsefulPictures_ERROR: onMouse-Click: ERROR_USEFUL_PIC'); console.log(exception); } } //---ON NOT(!) PICTURE CLICK FOR LMC...FOR MOVE PICTURE const leftMouseClickProcess = (clickEv) => { let coordX = clickEv.clientX; let coordY = clickEv.clientY; if(false === $gameSwitches.value(movableSwitchId)){ console.log('DKR.UsefulPictures_INFO: MOVEMENT DISABLE BY SWITCH!'); return; } //--move Main part if(-1 !== pictureToMoveId){ $gameScreen.movePicture( pictureToMoveId, picToMoveOrigin, clickEv.clientX, clickEv.clientY, picToMoveScaleX, picToMoveScaleY, picToMoveOpacity, picToMoveBlendMode, pictureToMoveSpeed ); setPictureIdToVariable(pictureToMoveId, lastMovedPicVarId); //--move Dropzone part let dropzone = isUsefulPicInDropzones([clickEv.clientX, clickEv.clientY]); let usefulPicture = getUsefulPicture(pictureToMoveId); removeUsefulPicOnDropzoneFromVault(pictureToMoveId ); if(null !== dropzone && undefined !== dropzone && dropzone.mark === usefulPicture.mark && DROPZONE_STATE_SLEEP_CODEWORD !== dropzone.dropState){ setPictureIdToVariable(pictureToMoveId, lastDroppedPicVarId); setPictureIdToVariable(dropzone.id, lastUsedDropzoneVarId); addUsefulPicOnDropzoneToVault(usefulPicture.id, dropzone.id); if(DROPZONE_TYPE_LOCK_CODEWORD === dropzone.dropType){ updateUsefulPicture(pictureToMoveId, [ ['isMovable', false], ['isClickableLeft', false], ['onLeftClickCommonEventId', 0] ]); } if(usefulPicture.onDropzoneCommonEventId > 0){ $gameTemp.reserveCommonEvent(usefulPicture.onDropz oneCommonEventId); } if(dropzone.onDropCommonEventId > 0){ $gameTemp.reserveCommonEvent(dropzone.onDropCommon EventId); } if(DROPZONE_AFTER_OFF_CODEWORD === dropzone.dropAfter){ updateDropzone(dropzone.id, [['dropState', 'sleep']]); } } //--for clear picture movement pictureToMoveId = -1; pictureToMoveSpeed = -1; touchedDropzoneId = -1; } } //---ON CLICK FOR RMC...CANCEL PICTURE MOVEMENT OR CE const rightMouseClickProcess = () => { let isDefaultLRMCWork = $gameSwitches.value(defaultLRMCWorkSwitchId); if(true === isDefaultLRMCWork){ console.log('DKR.UsefulPictures_INFO: isDefaultLRMCWork IS ON, CANT WORK!'); return; } if(rightMouseClickEventId > 0){ $gameTemp.reserveCommonEvent(rightMouseClickEventI d); } //--for cancel picture movement pictureToMoveId = -1; pictureToMoveSpeed = -1; touchedDropzoneId = -1; } //---ON CLICK ON MMC...CIRCLE...FOR CE const middleMouseClickProcess = () => { let isDefaultLRMCWork = $gameSwitches.value(defaultLRMCWorkSwitchId); if(true === isDefaultLRMCWork){ console.log('DKR.UsefulPictures_INFO: isDefaultLRMCWork IS ON, CANT WORK!'); return; } if(middleMouseClickEventId > 0){ $gameTemp.reserveCommonEvent(middleMouseClickEvent Id); } } //---FOR CLICK: DETECT L-R-M CLICKS TouchInput._onMouseDown = function(event) { if (event.button === 0) { this._onLeftButtonDown(event); leftMouseClickProcess(event); } else if (event.button === 1) { this._onMiddleButtonDown(event); middleMouseClickProcess(); } else if (event.button === 2) { this._onRightButtonDown(event); rightMouseClickProcess(); } }; //---FOR GET PICTURE WIDTH AND HEIGHT const getPictureWidthAndHeight = (pictureId) => { let pictureHeightAndWidth = [-1, -1]; try{ let picsSpritesetList = SceneManager._scene._spriteset.children.find(obj => obj.children.length >= 99); let pictureSprite = picsSpritesetList.children[pictureId - 1]; let pictureWidth = pictureSprite.width; let pictureHeight = pictureSprite.height; pictureHeightAndWidth = [pictureWidth, pictureHeight]; }catch(exception){ console.log('DKR.UsefulPictures_ERROR: getPictureWidthAndHeight: ERROR | pic_id:', pictureId); console.log(exception); } return pictureHeightAndWidth; } //----MAKER LOGIC: END //----COMMANDS: BEGIN //--on/off default left right mouse click DKR.UsefulPictures.disableLRMC = function(){ disableMouseStandardBehaviour(); } DKR.UsefulPictures.enableLRMC = function(){ enableMouseStandardBehaviour(); } //-- //--set Common events to right muse click and middel mouse click DKR.UsefulPictures.setCommonEventToRMC = function(ceId){ rightMouseClickEventId = ceId; } DKR.UsefulPictures.setCommonEventToMMC = function(ceId){ middleMouseClickEventId = ceId; } //-- //-create/update/delete useful pictures DKR.UsefulPictures.testUsefulPics = function(){ let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || []; console.log('_usefulPicsList:', usefulPicsOnDropzonesVault); } DKR.UsefulPictures.createUsefulPic = function(picSettings){ createUsefulPicture(picSettings); } DKR.UsefulPictures.getUsefulPic = function(usefulPicId){ return getUsefulPicture(usefulPicId); } DKR.UsefulPictures.updateUsefulPic = function(usefulPicId, listOfSettingsToUpdate){ updateUsefulPicture(usefulPicId, listOfSettingsToUpdate); } DKR.UsefulPictures.deleteUsefulPic = function(usefulPicId){ deleteUsefulPicture(usefulPicId); } //-- //-create/update/delete dropzones DKR.UsefulPictures.testDropzones = function(){ let dropzonesList = $gameVariables.value(dropzonesListVarId) || []; console.log('_dropzonesList:', dropzonesList); } DKR.UsefulPictures.createDropZone = function(dropzoneSettings){ createDropzone(dropzoneSettings); } DKR.UsefulPictures.getDropZone = function(dropzoneId){ return getDropzone(dropzoneId); } DKR.UsefulPictures.updateDropZone = function(dropzoneId, listOfSettingsToUpdate){ updateDropzone(dropzoneId, listOfSettingsToUpdate); } DKR.UsefulPictures.deleteDropZone = function(dropzoneId){ deleteDropzone(dropzoneId); } //-- //--get informtation about useful pictures on dropzones DKR.UsefulPictures.testVault = function(){ let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || []; console.log(usefulPicsOnDropzonesVault); } DKR.UsefulPictures.isUsefulPicOnDropzones = function(usefulPicId, logicOrIndex){ return isUsefulPictureOnDropzones(usefulPicId, logicOrIndex); } DKR.UsefulPictures.isUsefulPicOnConcreteDropzone = function(usefulPicId, dropzoneId){ return isUsefulPictureOnConcreteDropzone(usefulPicId, dropzoneId); } DKR.UsefulPictures.getUsefulPicsFromDropzone = function(dropzoneId){ return getUsefulPicturesFromDropzone(dropzoneId); } //-- //----COMMANDS: END } )();
Загрузка:
Спойлер Версия 2.0 (плагин + демо):
Условия поставки плагина:
Поставляется AS-IS.
Вся ответственность при использовании - на Пользователе!
!
Совместимость:
Плагин существенно меняет логику работы мыши и частично - картинок.
Совместимость с другими плагинами на мышь - отсутствует.
Совместимость с другими плагинами на картинки - не гарантируется.
С другой стороны - плагин совместим с DKR_EntityCustomData.
Спойлер Лирическое отступление:Наверное, "вершина эволюции" моих экспериментов с картинками, на которые можно тыкать.
Мы же двигаем картинки по экрану, по сути?
Теперь можно двигать по факту. =)
Доберется ли проклятие карточных рогаликов до мейкера? Кто знает...
Обратите внимание - без просмотра демки работа и настройка плагина может быть не ясна.
Это издержки подобия универсальности (в моем исполнении). =(
Благодарности:
за идею/вдохновение
nirion , VarVarKa , Green-Leo , Петр .
специальные благодарности:
Phileas за идею работы над плагинами, Krimer за методику определения габаритов картинки.
Социальные закладки